package cn.com.dcsgo.controller;

import cn.com.dcsgo.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.List;

/**
 * controller获取前端参数
 *
 * @author Dcsgo
 * @since 2025/3/2 10:41
 */
@Controller
@RequestMapping("param")
public class ParamController {

    /**
     * 1.不处理
     * 对用可以直接完成赋值的简单数据类型，我们可以不做任何特殊处理
     * SpringMVC会自动将请求参数与方法参数进行绑定
     * 需要注意的是这种情况下前端没有传递指定的参数(漏传、错传)，SpringMVC会直接将对应的参数赋值为null
     *
     * @param name name
     * @param age  age
     * @return String
     */
    @ResponseBody
    @GetMapping("data")//http://localhost:8080/param/data?name=1111&age=13
    public String data(String name, Integer age) {
        System.out.println("name = " + name + ", age = " + age);
        return "name = " + name + ", age = " + age;
    }

    /**
     * 2.RequestParam注解配置参数
     * name或value属性可以指定要绑定到的前端参数
     * required 是否为必填项 默认是必填
     * defaultValue 默认值 未传递该参数时会使用默认值
     * 当必填项没有指定默认值且前端没有传递该参数时，SpringMVC会直接返回400错误码
     *
     * @param username 用户名绑定到account
     * @param password 密码
     * @return String
     */
    @ResponseBody
    @GetMapping("data2")
    public String data2(@RequestParam(name = "account") String username,
                        @RequestParam(required = false, defaultValue = "123456") String password) {
        System.out.println("username = " + username + ", password = " + password);
        return "username = " + username + ", password = " + password;
    }

    /**
     * 3.前端传递的是一对多的参数
     * 使用集合类型来接收参数，并使用 RequestParam 注解
     *
     * @param hobbies hobbies
     * @return String
     */
    @ResponseBody
    @GetMapping("data3")//http://localhost:8080/param/data3?hobby=geme&hobby=music&hobby=pingpong
    public String data3(@RequestParam("hobby") List<String> hobbies) {
        System.out.println("hobbies = " + hobbies);
        return "hobbies = " + hobbies;
    }

    /**
     * 4. 使用类来接收参数
     * 我们可以不做任何处理，SpringMVC会自动将请求参数与类中的属性进行绑定，
     * 与1类似，前端没有传递指定的参数(漏传、错传)，SpringMVC会直接将对应的属性赋值为null
     * 需要注意的是这里如果使用 RequestParam 注解，SpringMVC 会要求传递的参数就是 user
     * 而不是User内部的属性
     *
     * @param user user
     * @return String
     */
    @ResponseBody
    @GetMapping("data4")
    public String data4(User user) {
        System.out.println("user = " + user);
        return "user = " + user;
    }

}
